package com.jxj.study.allConfig.beans;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Configuration
public class  ExecutorConfig {
    /*
    *  此处成员变量应该使用@Value从配置中读取
    *
    *  corePoolSize：核心线程数 如果工作线程数小于corePoolSize，则创建一个新线程并执行该任务，
    *                   如果工作线程数大于等于corePoolSize，则将任务添加到阻塞队列。
    *                   如果阻塞队列满了，则判断工作线程数是否小于maxPoolSize，
    *                   如果小于则创建新线程并执行该任务；否则调用handler拒绝策略。
    */
    private static final int corePoolSize = 10;//
    private static final int maxPoolSize = 200;
    private static final int queueCapacity = 10;
    @Bean("taskExecutor")
//    @Scope(value="prototype") 多列
    public Executor taskExecutor() {
        //创建一个定长线程池，支持定时及周期性任务执行
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
//        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        executor.initialize();
        return executor;
    }

    // 创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待
    @Bean
    public ExecutorService executorService(){
        return Executors.newFixedThreadPool(15);
    }

//    public static void main(String[] args) {
//        TimerTask timerTask = new TimerTask() {
//            @Override
//            public void run() {
//                System.out.println("task  run:"+ new Date());
//            }
//        };
//        Timer timer = new Timer();
//        //安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里是每3秒执行一次
//        timer.schedule(timerTask,10,3000);
//    }
}